package com.kgc.kmall.kmallcartweb.controller;

import com.alibaba.fastjson.JSON;
import com.kgc.kmall.annotations.LoginRequired;
import com.kgc.kmall.bean.OmsCartItem;
import com.kgc.kmall.bean.PmsSkuInfo;
import com.kgc.kmall.kmallcartweb.cookie.CookieUtil;
import com.kgc.kmall.service.CartService;
import com.kgc.kmall.service.SkuService;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.*;

@Controller
public class CartController {

    @Reference
    SkuService skuService;
    @Reference
    CartService cartService;

    @LoginRequired(value=false)
    @RequestMapping("/addToCart")
    public String addToCart(long skuId, Integer num, HttpServletRequest request, HttpServletResponse response){
        List<OmsCartItem> omsCartItems=new ArrayList<>();
        //根据skuid查询出sku商品信息
        PmsSkuInfo skuInfo = skuService.selectBySkuId(skuId);
        //将商品信息封装成购物车信息
        OmsCartItem omsCartItem = new OmsCartItem();
        omsCartItem.setCreateDate(new Date());
        omsCartItem.setDeleteStatus(0);
        omsCartItem.setModifyDate(new Date());
        omsCartItem.setPrice(new BigDecimal(skuInfo.getPrice()));
        omsCartItem.setProductAttr("");
        omsCartItem.setProductBrand("");
        omsCartItem.setProductCategoryId(skuInfo.getCatalog3Id());
        omsCartItem.setProductId(skuInfo.getSpuId());
        omsCartItem.setProductName(skuInfo.getSkuName());
        omsCartItem.setProductPic(skuInfo.getSkuDefaultImg());
        omsCartItem.setProductSkuCode("11111111111");
        omsCartItem.setProductSkuId(skuId);
        omsCartItem.setQuantity(num);
        //判断用户是否登录
        String memberId="";
        if (request.getAttribute("memberId")!=null){
            Integer id=(Integer) request.getAttribute("memberId");
            memberId=id+"";
        }
        if (request.getAttribute("memberId")!=null){
            Integer id=(Integer) request.getAttribute("memberId");
            memberId=id+"";
        }
        if(StringUtils.isBlank(memberId)){
         //用户没有登录
            //取出cookie的值
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            if(StringUtils.isBlank(cartListCookie)){
              //cookie为空
                omsCartItems.add(omsCartItem);
            }else{
              //cookie不为空
                omsCartItems= JSON.parseArray(cartListCookie,OmsCartItem.class);
                //判断添加的购物车数据在cookie中是否存在
                boolean b = if_cart_exist(omsCartItems, omsCartItem);
                //若为真
                if(b){
                 //之前添加过,更新购物车添加数量
                    for (OmsCartItem cartItem : omsCartItems) {
                        if(cartItem.getProductSkuId().equals(omsCartItem.getProductSkuId())){
                        cartItem.setQuantity(cartItem.getQuantity()+num);
                        break;
                        }
                    }
                }else{
                 //之前没添加,存储到当前的购物车
                    omsCartItems.add(omsCartItem);
                }
            }
            System.out.println(JSON.toJSONString(omsCartItems));
            //更新cookie
            CookieUtil.setCookie(request,response,"cartListCookie", JSON.toJSONString(omsCartItems), 60 * 60 * 72, true);
        }else{
            //用户登录了
            //判断OmsCartItem中是否有购物车数据
            OmsCartItem omsCartItem1 = cartService.ifCartExistByUser(Long.parseLong(memberId), skuId);
            if(omsCartItem1==null){
                omsCartItem.setMemberId(Long.parseLong(memberId));
                omsCartItem.setMemberNickname("test令狐冲");
                cartService.addCart(omsCartItem);
            }else {
                //有的话,修改购物车数量
                Integer quantity = omsCartItem1.getQuantity();
                omsCartItem1.setQuantity(quantity+num);
                cartService.updateCart(omsCartItem1);
            }
            // 同步缓存
            cartService.flushCartCache(memberId);
        }

        return "redirect:/success.html";
    }

    //创建一个方法判断购物车数据在cookie中是否存在
    private boolean if_cart_exist(List<OmsCartItem> omsCartItems,OmsCartItem omsCartItem){
        boolean b=false;
        for (OmsCartItem cartItem : omsCartItems) {
            Long productSkuId = cartItem.getProductSkuId();
            if(omsCartItem.getProductSkuId().equals(productSkuId)){
              b=true;
              break;
            }
        }
        return b;
    }


    //显示购物车列表
    @LoginRequired(false)
    @RequestMapping("/cartList")
    public String cartList(Model model, HttpServletRequest request){
        List<OmsCartItem> omsCartItemList=new ArrayList<>();
        String memberId="";
        if (request.getAttribute("memberId")!=null){
            Integer id=(Integer) request.getAttribute("memberId");
            memberId=id+"";
        }
        if(StringUtils.isNotBlank(memberId)){
         //已经登录查询db
                omsCartItemList = cartService.cartList(memberId);
        }else{
            //没有登录查询cookie
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            if(StringUtils.isNotBlank(cartListCookie)){
                omsCartItemList=JSON.parseArray(cartListCookie,OmsCartItem.class);
            }
        }
        for (OmsCartItem omsCartItem : omsCartItemList) {
            omsCartItem.setTotalPrice(omsCartItem.getPrice().multiply(new BigDecimal(omsCartItem.getQuantity())));
        }
        BigDecimal totalAmount = getTotalAmount(omsCartItemList);
        model.addAttribute("totalAmount",totalAmount);
        model.addAttribute("cartList",omsCartItemList);
        return "cartList";
    }


    //计算总价
    @LoginRequired(false)
    @RequestMapping("/checkCart")
    @ResponseBody
    public Map<String,Object> checkCart(String isChecked,Long skuId,HttpServletRequest request,HttpServletResponse response){
        Map<String,Object> map=new HashMap<>();
        String memberId="";
        if (request.getAttribute("memberId")!=null){
            Integer id=(Integer) request.getAttribute("memberId");
            memberId=id+"";
        }
        if(StringUtils.isNotBlank(memberId)){
            //登录了
            OmsCartItem omsCartItem=new OmsCartItem();
            omsCartItem.setMemberId(Long.parseLong(memberId));
            omsCartItem.setProductSkuId(skuId);
            omsCartItem.setIsChecked(isChecked);
            cartService.checkCart(omsCartItem);
            //计算总价
            List<OmsCartItem> omsCartItems = cartService.cartList(memberId);
            BigDecimal totalAmount = getTotalAmount(omsCartItems);
            map.put("totalAmount",totalAmount);
        }else{
            //没有登录
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            if(StringUtils.isNotBlank(cartListCookie)){
              List<OmsCartItem>  omsCartItemList=JSON.parseArray(cartListCookie,OmsCartItem.class);
              //修改cookie
                for (OmsCartItem omsCartItem : omsCartItemList) {
                    if(omsCartItem.getProductSkuId()==skuId){
                       omsCartItem.setIsChecked(isChecked);
                    break;
                    }
                }
                //保存cookie
                CookieUtil.setCookie(request,response,"cartListCookie", JSON.toJSONString(omsCartItemList), 60 * 60 * 72, true);
                //计算总价
                BigDecimal totalAmount =getTotalAmount(omsCartItemList);
                map.put("totalAmount",totalAmount);
            }
        }
        return map;
    }

    public BigDecimal getTotalAmount(List<OmsCartItem> omsCartItems){
        BigDecimal bigDecimal=new BigDecimal(0);
        for (OmsCartItem omsCartItem : omsCartItems) {
            //计算小计
            omsCartItem.setTotalPrice(omsCartItem.getPrice().multiply(new BigDecimal(omsCartItem.getQuantity())));
            if (omsCartItem.getIsChecked().equals("1")){
               bigDecimal=bigDecimal.add(omsCartItem.getTotalPrice());
            }
        }
        return bigDecimal;
    }

    //跳转结算页面
    @LoginRequired(value=true)
    @RequestMapping("toTrade")
    public String toTrade(){
        return "toTrade";
    }


}
